

import bpy
import 全局控制.Node.节点和插座基类.bl_节点基类 as 基类
import Core.bl_UI配色 as UI配色
import engine.initLIB.load_dll as engineLib
import ctypes

import math


E_计算类型枚举_1 = [
	("TYPE_abs", "abs", "", 0),
	("TYPE_sign", "sign", "", 1),
	("TYPE_floor", "floor", "", 2),
	("TYPE_trunc", "trunc", "", 3),
	("TYPE_round", "round", "", 4),
	("TYPE_roundEven", "roundEven", "", 5),
	("TYPE_ceil", "ceil", "", 6),
	("TYPE_fract", "fract", "", 7),
]





engineLib.flexCAPI.f_创建步进函数计算节点.restype = ctypes.c_bool





def f_代码头置入_p1_公共函数(self, context):
	代码头 = '# A:AValue = C:data  --  a + b = c'
	self.m_Code.lines[0].body = 代码头

class C_Node_p1_公共函数(基类.C_SN_基类):
	bl_dname = 'bl_node_公共函数'
	bl_label = '公共函数'
	
	m_运算类型 = bpy.props.EnumProperty(items = E_计算类型枚举_1, name="value", default="TYPE_abs" )
	m_Code = bpy.props.PointerProperty(type=bpy.types.Text, update=f_代码头置入_p1_公共函数)
	def init(self, context):
		super(C_Node_p1_公共函数, self).f_init(context)
		self.inputs.new('C_NodeSocket_f', name='A')
		self.outputs.new('C_NodeSocket_f', name='C')
		
	def draw_buttons(self, context, layout):
		if self.m_Code == None :
			layout.prop(self, 'm_运算类型')
		layout.prop(self, 'm_Code')

	def f_update(self, 是否向下传递=False, input插座=None):
		AValue = 插座基类.f_取列表单值(self.inputs['A'].f_getData())
		
		if self.m_Code == None :
			if self.m_运算类型 == 'TYPE_abs' :
				c = abs(AValue)
			elif self.m_运算类型 == 'TYPE_sign' :
				print('还在编写中')
			self.outputs['C'].f_setData(c)

		else:
			全局变量 = {'AValue':AValue, 'data':0.0}
			代码 = self.m_Code.as_string() + '\n'
			exec(代码, 全局变量)
			#print('全局变量[data] = ', self.name, 全局变量['data'])
			self.outputs['C'].f_setData(全局变量['data'])
		
		super(C_Node_p1_公共函数, self).f_update(是否向下传递, input插座)
		
	'''def f_input插座Update(self, input插座, 上层Output=None):
		if input插座 :
			v = input插座.f_getData()
			input插座.f_setData(v)
		super(C_Node_p1_公共函数, self).f_input插座Update(input插座, 上层Output)'''

class C_NODE_AddMenu_p1_公共函数(bpy.types.Operator):
	bl_idname = 'node.global_node_p1_publicfunction'
	bl_label = 'p1 公共函数'
	bl_options = {'REGISTER', 'UNDO'}
	
	def execute(operator, context):
		operator.use_transform = True
		bpy.ops.node.add_node(type='C_Node_p1_公共函数', use_transform=True)
		return {'FINISHED'}









































class C_Node_步进函数计算(基类.C_Node_基类):
	bl_dname = 'bl_node_步进函数计算'
	bl_label = '步进函数计算'
	
	def init(self, context):
		super(C_Node_步进函数计算, self).f_init(context)
		self.inputs.new('C_Socket_Vec3_Array1D', name='值')
		self.inputs.new('C_Socket_Vec3_Array1D', name='跨度')
		self.outputs.new('C_Socket_Vec3i_Array1D', name='值')
		self.f_toCPP()

		self.use_custom_color = True
		self.color = 配色.g_内部节点颜色

	def f_toCPP(self):
		是否更新 = engineLib.flexCAPI.f_创建步进函数计算节点(ctypes.c_wchar_p(self.id_data.name), ctypes.c_wchar_p(self.name), self.f_getPyObject());
		if 是否更新 :
			self.inputs['值'].f_update()
			self.inputs['跨度'].f_update()

class C_NODE_MENU_步进函数计算(bpy.types.Operator):
	bl_idname = 'node.function_calculation_step'
	bl_label = '步进函数计算'
	bl_options = {'REGISTER', 'UNDO'}
	def execute(operator, context):
		bpy.ops.node.add_node(type='C_Node_步进函数计算', use_transform=True)
		return {'FINISHED'}




























classes = (
	C_Node_p1_公共函数,
	C_NODE_AddMenu_p1_公共函数,


	C_Node_步进函数计算,
	C_NODE_MENU_步进函数计算,
)

def register():
	for c in classes:
		bpy.utils.register_class(c)
		
def unregister():
	for c in classes:
		bpy.utils.unregister_class(c)


